'use strict'

let fs = require('fs');
let path = require('path');
let router = require('koa-router')();

//搜索过滤所有路由文件
function getEachControllerFiles(dir){
    //需要过滤真正的控制器文件(是JS文件，并且不是index.js)
    let files = fs.readdirSync(dir);
    let controllerFiles = files.filter((name)=>{
        return  name.endsWith('.js')&& name !== 'index.js'; 
    });
    return controllerFiles;
}

//遍历每一个路由文件，注册每一个定义路由
function registeRoutes(files,currentPath){
    //遍历每个路径文件
    files.forEach(item => {
        let tmpPath = path.join(currentPath, item);
        // 引入路径文件，准备遍历其暴露的路径定义
        let routerObj = require(tmpPath);
        // 循环定义路由及对应的处理函数
        for (let r in routerObj) {
            let arrValue=routerObj[r];
            // 获取路由定义的类型，是get请求还post请求，分别调用不同的函数来调用
            let type = routerObj[r][0];
            // 获取路由定义中的请求后要调用的函数
            // let fn = routerObj[r][1];
            if (type === 'get') {
                // 为了判断传入的数组里面有没有包含auth，没有正按正常处理；有的话，需要auth传入作为第二参数
                if(arrValue.length===2){
                    let fn=arrValue[1];
                    router.get(r, fn);
                }else{
                    let auth=arrValue[1];
                    let fn=arrValue[2];
                    router.get(r,auth,fn);
                }                
            } else {
                // 为了判断传入的数组里面有没有包含auth，没有正按正常处理；有的话，需要auth传入作为第二参数
                if(arrValue.length===2){
                    let fn=arrValue[1];
                    router.post(r, fn);
                }else{
                    let auth=arrValue[1];
                    let fn=arrValue[2];
                    router.post(r,auth,fn);
                }
            }
        }
    })
}

//将文本实现为一个中间件，以便在app.js中可以直接注册使用

module.exports = function(dir){
    let defaultDir=dir || '/controllers';
    // 项目当前绝对路径
    let root = path.resolve('.');
    // 获得控制器的绝对路径
    let resultControllerPath = path.join(root, defaultDir);

    // 获得控制器目录下的所有路由文件
    let files=getEachControllerFiles(resultControllerPath);

    // 注册定义的路由
    registeRoutes(files,resultControllerPath);

    //返回待在app执行的注册函数
    return router.routes();
}